import {genNs} from './genNs';
import {removeArrayItemAll} from './removeArrayItem';

let id=0;
export const genCancelNs=(namespace=('genCancelNs'+id++))=>{
    const nsData=genNs();
    return {
        add(ns,cancel){
            if(typeof ns==='function'){
                cancel=ns;
                ns=namespace;
            }
            return nsData.add(ns,cancel);
        },
        getCancel(data){
            const id=data.id;
            return{
                id,
                cancel:()=>{
                    const item=nsData.getById(id);
                    if(item&&item.value[0]){
                        item.value[0]();
                        item.value[0]=null;
                    }
                    nsData.removeById(id);
                }
            }
        },
        addOne(ns,cancel){
            this.cancel(ns,cancel);
            return this.add(ns,cancel);
        },
        addIfNotExist(ns,cancel){
            const [data]=nsData.get(ns,cancel);
            if(data){
                return data;
            }
            return this.add(ns,cancel);
        },
        cancel(ns=namespace,cancel){
            const data=nsData.get(ns,cancel);
            for(let i=0,il=data.length;i<il;i++){
                this.getCancel(data[i]).cancel();
            }
        },
        cancelAll(){
            this.cancel('');
        }
    }
};

export default genCancelNs;